package org.example.analysis.service.dataobj;

import lombok.Data;
import lombok.EqualsAndHashCode;
import org.example.analysis.model.entity.JavaClassInfo;
import org.example.analysis.model.entity.JavaMethodInfo;

import java.util.List;
import java.util.ArrayList;
import java.util.Date;
import java.util.stream.Collectors;

/**
 * @author wuyong
 * @date 2025/6/5
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class ProjectDataObject extends BaseDataObject{
    /**
     * 项目名称
     */
    private String projectName;
    
    /**
     * 源代码目录
     */
    private String sourceDir;
    
    /**
     * 分析开始时间
     */
    private Date analysisStartTime;
    
    /**
     * 分析结束时间
     */
    private Date analysisEndTime;
    
    /**
     * 分析状态
     */
    private String analysisStatus;
    
    /**
     * 错误信息
     */
    private String errorMessage;
    
    /**
     * 类列表
     */
    private List<ClassDataObject> classDataObjects = new ArrayList<>();
    
    /**
     * 入口点列表
     */
    private List<EntryPointDataObject> entryPointDataObjects = new ArrayList<>();

    public List<JavaClassInfo> toJavaClassInfo() {
        return classDataObjects.stream().map(ClassDataObject::toJavaClassInfo).collect(Collectors.toList());
    }
    public List<MethodDataObject> getAllMethodDataObjects() {
        List<MethodDataObject> methods = new ArrayList<>();
        for (ClassDataObject classDataObject : classDataObjects) {
            methods.addAll(classDataObject.getMethods());
        }
        return methods;
    }

    public List<JavaMethodInfo> toJavaMethodInfo() {
        return getAllMethodDataObjects().stream().map(MethodDataObject::toJavaMethodInfo).collect(Collectors.toList());
    }

    /**
     * 项目统计信息
     */
    @Data
    public static class ProjectStats {
        /**
         * 总类数
         */
        private int totalClasses;
        
        /**
         * 总方法数
         */
        private int totalMethods;
        
        /**
         * 总代码行数
         */
        private int totalCodeLines;
        
        /**
         * 接口数量
         */
        private int interfaceCount;
        
        /**
         * 抽象类数量
         */
        private int abstractClassCount;
        
        /**
         * 入口点数量
         */
        private int entryPointCount;
    }
    
    /**
     * 项目统计信息
     */
    private ProjectStats stats = new ProjectStats();
}
